Java/JSF
[współbieżne] Producent - konsument
zamknięty:
kwiecień 2011
kwiecień 2011
zleceniodawca:
projekt autorski
Opis: projekt autorski
Aplikacja napisana na potrzeby przedmiotu 'Programowanie współbieżne'. Na wejściu klienci dostają informację po ile paczek mają konsumować dane wytworzone przez producentów.
Poniżej przedstawiony jest kod aplikacji, oczywiście, bez klasy GUI.
public class ProducentKonsument {
static GUI g;
static final int MAX = 20;
static double[] buf = new double[MAX];
static int wy = 0;
static int we = 0;
static int ileWyprodukowano = 0;
static Semaphore ileProducentowS = new Semaphore(1, true);
static Semaphore ileKonsumentowS = new Semaphore(1, true);
static Semaphore ileMoznaWyprodukowacS = new Semaphore(MAX, true);
static Semaphore czyJestCokolwiekS = new Semaphore(0);
static double suma = 0;
static double ilosc = 0;
static double iloczyn = 1;
static class Producent extends Thread {
int id;
public Producent(int id) {
this.id = id;
}
private void produkuj() throws InterruptedException {
g.p.get(id).setForeground(Color.red);
g.p.get(id).setText("produkuję [" + we + "]");
buf[we] = 10 * Math.random();
we = (we + 1) % MAX;
ileWyprodukowano++;
sleep(1000);
g.p.get(id).setText("skończyłem produkować");
g.p.get(id).setForeground(Color.blue);
}
@Override
public void run() {
while (true) {
try {
ileProducentowS.acquireUninterruptibly();
ileMoznaWyprodukowacS.acquireUninterruptibly();
produkuj();
ileProducentowS.release();
czyJestCokolwiekS.release();
} catch (InterruptedException ex) {
Logger.getLogger(ProducentKonsumentZadLiczby.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
static class Konsument extends Thread {
private double x;
private int id;
private int n;
public Konsument(int id, int n) {
this.id = id;
this.n = n;
}
private void konsumuj() throws InterruptedException {
while (ileWyprodukowano < n) {
sleep(100);
}
for (int i = 0; i < n; i++) {
g.k.get(id).setForeground(Color.red);
g.k.get(id).setText("konsumuję [" + wy + "]: " + x);
x = buf[wy];
g.d.get(0).setText(String.valueOf(suma += x));
g.d.get(1).setText(String.valueOf(suma / ++ilosc));
g.d.get(2).setText(String.valueOf(iloczyn *= x));
wy = (wy + 1) % MAX;
sleep(1000);
ileMoznaWyprodukowacS.release();
}
g.k.get(id).setForeground(Color.blue);
g.k.get(id).setText("skonsumowałem");
sleep(1000);
ileWyprodukowano -= n;
}
@Override
public void run() {
while (true) {
try {
g.k.get(id).setForeground(Color.gray);
g.k.get(id).setText("czekam");
ileKonsumentowS.acquireUninterruptibly();
czyJestCokolwiekS.acquireUninterruptibly();
konsumuj();
ileKonsumentowS.release();
} catch (InterruptedException ex) {
Logger.getLogger(ProducentKonsumentZad.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
g = new GUI();
g.setVisible(true);
int k1n = Integer.parseInt(JOptionPane.showInputDialog("Podaj n (<20) dla pierwszego konsumenta:"));
int k2n = Integer.parseInt(JOptionPane.showInputDialog("Podaj n (<20) dla drugiego konsumenta:"));
int k3n = Integer.parseInt(JOptionPane.showInputDialog("Podaj n (<20) dla trzeciego konsumenta:"));
(new Producent(0)).start();
(new Producent(1)).start();
(new Konsument(0, k1n)).start();
(new Konsument(1, k2n)).start();
(new Konsument(2, k3n)).start();
}
});
}
}


![[współbieżne] Czytelnicy - pisarze](/newhome/images/arr-right.png)